perm filename EXIAL.FAI[IAL,BGB] blob sn#145887 filedate 1975-02-18 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00014 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE EXIAL -  EXPERIMENTAL INCREMENTAL ASSEMBLY LANGAUAGE.
C00003 00003	TEST
C00005 00004	GETCHW,MKNODE,KLNODE,INIT
C00007 00005	SUBR(EDDPY,CURCHR)
C00009 00006	SUBR(EDSYS,CHAR)	INVOKE THE SYSTEM LINE EDITOR.
C00014 00007	SUBR(EDTEXT)
C00016 00008	EDTEXT - COMMAND TABLES
C00019 00009	MOVE CURSOR
C00020 00010	DELETE
C00022 00011	LINED
C00024 00012	INSLIN: NLINK N,N
C00026 00013	SUBR(LOOKUP,KEY)
C00027 00014	
C00028 ENDMK
C⊗;
TITLE EXIAL -  EXPERIMENTAL INCREMENTAL ASSEMBLY LANGAUAGE.

COMMENT *
   STANFORD UNIVERSITY  -  BRUCE G. BAUMGART  -  FEBRUARY 1975.
   TEXT EDITOR - INCREMENTAL ASSEMBER - LOADER - DEBUGGER.
   LIST PROCESSOR - MEMORY MANAGEMENT - ARITHMETIC & TRIG.
   DISPLAY ROUTINES - MEMORY MANAGEMENT 
*
	.INSERT MN

EXTERN DPYBUF,AIVECT,DPYOUT,DPYBIG,DPYSET,DTYO,DPYSTR,DPYPTR,RIVECT,DPYBRT
	LEFT(NLINK,0)↔RIGHT(PLINK,0)

	NODSIZ ←← =16	;WORDS PER NODE.
	NODCNT ←← =100	;NODE COUNT.

MEM:	BLOCK NODCNT * NODSIZ
AVAIL:	0

	CLRLIN:	BLOCK 2
	EDBUF:	BLOCK =21
	EDBFLN←←.-EDBUF
	INTEGER META,CTRL
;TEST
PATCH:	BLOCK 100
PDL:	BLOCK 100

SA:	CALLI
	LAC P,[IOWD 20,PDL]
	CALL(INIT)
	DPYPOS -=400↔DPYSIZ 2002
	CALL(EDTEXT)
	EXIT

NODE0:	N1
NODE1:	N1

N1:	XWD  0,N2↔	ASCIZ/LINE 1 - SHIT.../↔	ORG N1+NODSIZ
N2:	XWD N1,N3↔	ASCIZ/LINE 2 - FUCK.../↔	ORG N2+NODSIZ
N3:	XWD N2,N4↔	ASCIZ/LINE 3 - BASTARD/↔	ORG N3+NODSIZ
N4:	XWD N3,N5↔	ASCIZ/LINE 4 - BITCH/↔		ORG N4+NODSIZ
N5:	XWD N4,N6↔	ASCIZ/LINE 5......../↔		ORG N5+NODSIZ
N6:	XWD N5,N7↔	ASCIZ/LINE 6......../↔		ORG N6+NODSIZ
N7:	XWD N6,N8↔	ASCIZ/LINE 7......../↔		ORG N7+NODSIZ
N8:	XWD N7,N9↔	ASCIZ/LINE 8......../↔		ORG N8+NODSIZ
N9:	XWD N8, 0↔	ASCIZ/LINE 9......../↔		ORG N9+NODSIZ
;GETCHW,MKNODE,KLNODE,INIT
GETCHW:	INCHRW 1↔POPJ 17,

SUBR(MKNODE)
COMMENT .-----------------------------------------------------------.
	SKIPN 1,AVAIL↔GO[FATAL(NODE MEMORY FULL)]
	LAC(1)↔DAC AVAIL↔SETZM(1)↔POP0J
ENDR MKNODE;2/10/75(BGB)--------------------------------------------.

SUBR(KLNODE,NODE)
COMMENT .-----------------------------------------------------------.
	CDR 1,NODE↔LAC 1↔DIP↔AOS	;CLEAR THE NODE.
	SETZM(1)↔BLT NODSIZ-1(1)
	EXCH 1,AVAIL↔MOVEM 1,@AVAIL	;PUT NODE ON AVAIL LIST.
	POP1J
ENDR KLNODE;2/10/75(BGB)--------------------------------------------.

SUBR(INIT)
COMMENT .-----------------------------------------------------------.
	LAC [XWD MEM,MEM+1]↔SETZM MEM↔BLT MEM+NODCNT*NODSIZ-1	;CLEAR MEM.
	MOVEI 1,MEM↔DAC 1,AVAIL					;INIT AVAIL.
	DIP 1,1↔ADD 1,[XWD NODSIZ,0]↔MOVEI NODCNT-1		;INIT LOOP.
L1:	HLRZM 1,(1)↔ADD 1,[XWD NODSIZ,NODSIZ]↔SOJG L1		;LOOP.
	POP0J
ENDR INIT;2/10/75(BGB)----------------------------------------------.

SUBR(KLTEXT,NODE)
COMMENT .-----------------------------------------------------------.
	SETZ↔CDR 2,NODE
	CAR 1,(2)↔CDR 3,(2)
	DIP 1,(3)↔DAP 3,(1)
	SKIPN 1↔DAC 3,NODE0
	CALL(KLNODE,2)
	LAC 1,3↔POP1J
ENDR KLTEXT;2/12/75(BGB)--------------------------------------------.
SUBR(EDDPY,CURCHR)
COMMENT .-----------------------------------------------------------.
	N←4
;INITIALIZE DISPLAY FOR GLASS 17
	CALL(DPYSET,DPYBUF)↔CALL(DPYBIG,[2])↔CALL(DPYBRT,[2])
	CALL(AIVECT,[-777],[=460])
	CALL(DPYSTR,[[ASCIZ/*****************/]])↔JSR DPCRLF
	SETZM CURFLG#↔SETZM CUR#
;DISPLAY ALL THE LINES
	SKIPN N,NODE0↔GO L2			;FIRST LINE
L1:	CAMN N,NODE1↔JSR DPYCUR
	MOVEI 1(N)↔CALL(DPYSTR,0)↔JSR DPCRLF	;DISPLAY LINE OF TEXT.
	PLINK N,N↔JUMPN N,L1
;DISPLAY LAST LINE.
L2:	SKIPN CUR↔JSR DPYCUR
	CALL(DPYSTR,[[ASCIZ/*****************/]])↔JSR DPCRLF
	CALL(DPYOUT,[17])↔POP1J
;.......................................
DPYCUR:	0↔CALL(RIVECT,[-15],[0])		;DISPLAY LINE CURSOR.
	CDR 1,DPYPTR
	DAC 1,CLRLIN
	SETOM CURFLG↔SETOM CUR↔CALL(DTYO,CURCHR)
	CALL(DPYSTR,<[[BYTE(7) " ",15,0]]>)
	GO @DPYCUR
;.......................................
DPCRLF:	0↔SKIPN CURFLG↔GO DPCRL2
	SETZM CURFLG
	MOVSI 1,700
	HLLM 1,DPYPTR
	HRLZ 1,DPYPTR
	ADD 1,[XWD 1,20]
	DAC 1,CLRLIN+1
DPCRL2:	CALL(DPYSTR,[[ASCIZ/
/]])↔	GO @DPCRLF
ENDR EDDPY;4-MAY-73(TVR)_____________________________________________
SUBR(EDSYS,CHAR)	;INVOKE THE SYSTEM LINE EDITOR.
COMMENT .----------------------------------------------------------.
	ACCUMULATORS{N,C1,C2,P1,P2}
;PUT TEXT INTO LINE BUFFER.
	LAC N,NODE1↔HRLI 1(N)↔HRRI EDBUF↔BLT EDBUF+NODSIZ-2
	PTLOAD[0↔EDBUF] 		;WORRY ABOUT TYPE AHEAD.
	LAC 1,CHAR↔SETZ↔PTWR1W
	LAC 1,CLRLIN+1↔PGSEL 17
	SKIPE CLRLIN↔UPGMVM 1,@CLRLIN
;HOW MANY LINES FROM THE TOP.
	MOVEI C1,1↔LAC 1,NODE1
	NLINK 1,1↔SKIPE 1↔AOJA C1,.-2
	IMULI C1,-30			;POSITION THE LINE EDITOR.
	ADDI C1,=460↔LEYPOS (C1)
	INWAIT↔CALL(SETEXT,[EDGET])
	LEYPOS↔LAC 1,BRKCHR↔POP1J
;.......................................
EDGET:	INCHSL 1↔POPJ P,
	CAIE 1,12↔CAIL 1,200↔GO[DAC 1,BRKCHR↔GO EDGET]
	CAIN 1,15↔GO [INCHSL 1↔JFCL↔DAC 1,BRKCHR↔POPJ P,]
	CAIN 1,175↔GO BLAST↔AOS (P)↔POPJ P,
;.......................................
BLAST:	SUB P,[XWD 2,2]↔LEYPOS		;ALT MODE TO RESTORE LINE.
	INCHSL 1↔GO .+5
	CAIE 1,15↔GO .-3
	INCHSL 1↔JFCL
	LAC P2,[POINT 7,EDBUF]
	CALL(SETEXT,[ILDB 1,P2↔POPJ P,])
	SETZ 1,↔POP1J
;.......................................
	INTEGER BRKCHR,FOOFLG
ENDR EDSYS;4-MAY-73(TVR)_____________________________________________
SUBR(EDTEXT)
COMMENT .-----------------------------------------------------------.
	ACCUMULATORS{T1,T2,T3,CNT,SGN,CHR,N}
	SKIPA N,NODE1
L0:	POP P,0↔SETZ CHR,
L1:	CALL(EDDPY,["→"])
	SETZB CNT,SGN
	SKIPN CHR
L2:	GO[CALL(GETCHW)↔LAC CHR,1↔GO .+1]
	CAIN CHR,15↔GO L2
	LDB 1,[POINT 2,CHR,35-7]		;CONTROL BITS.
	LAC T1,CTABS(1)
	LAC T2,CHR↔ANDI T2,177			;7-BIT ASCII

;ACCUMULATE ITERATION NUMBER.
	CAIL T2,"0"↔CAIL T2,"9"↔GO .+3
	TRNE CHR,200↔GO[IMULI CNT,=10
	  ADDI CNT,-"0"(T2)↔GO L2]
	CAIL T2,"a"↔CAILE T2,"z"↔GO L3↔SUBI T2,40	;CONVERT TO UPPER CASE.

L3:	CAR 0,(T1)↔CAIE 0,(T2)↔AOBJN T1,L3
	CAIE 0,(T2)↔GO[TRNN CHR,200↔GO LINED
UNKNOWN:     OUTSTR[ASCIZ/Unknown command: /]
	     TRNE CHR,200↔OUTSTR[ASCIZ/<control>/]
	     TRNE CHR,400↔OUTSTR[ASCIZ/<meta>/]
	     OUTCHR CHR↔GO L0+1]
	CDR T2,(T1)↔PUSHJ P,(T2)↔GO L1↔GO L2	;COMMAND DISPATCH.
;.......................................
;EDTEXT - COMMAND TABLES
;--------------------------------------------------------------------
CTABS:	XWD -CLEN0,CTAB0	; λ
	XWD -CLEN1,CTAB1	; α
	XWD -CLEN2,CTAB2	; β
	XWD -CLEN3,CTAB3	; ε
;PLAIN---------------------------------------------------------------
CTAB0:	XWD 12,[MOVEI 1↔GO MOVER]	;LF
	XWD 177,[MOVNI 1↔GO MOVER]	;BS
	XWD 13,[MOVNI 1↔GO MOVER]	;VT
	XWD 175,L0			;ALT
		CLEN0←←.-CTAB0
;CTRL---COMMANDS TO SYSTEM LINE EDITOR ------------------------------
CTAB1:	XWD "D",LINED			;αD DELETE
	XWD "I",LINED			;αI INSERT
	XWD "K",LINED			;αK KILL TO DELIMITER
	XWD "S",LINED			;αS SCAN
	XWD   9,LINED			;αTAB
	XWD  40,LINED			;αSPACE
	XWD  12,[MOVEI 1↔GO MOVER]	;αLF
;META/CTRL-----------------------------------------------------------
CTAB3:	XWD  13,[MOVNI 1↔GO MOVER]	;VT
	XWD "<",[MOVNI 4↔GO MOVER]
	XWD ">",[MOVEI 4↔GO MOVER]
	XWD "≤",[MOVNI 16↔GO MOVER]
	XWD "≥",[MOVEI 16↔GO MOVER]
	XWD "↑",[MOVNI 1↔MOVEI CHR,211↔GO MOVER2]
	XWD "↓",[MOVEI 1↔MOVEI CHR,211↔GO MOVER2]
	XWD "Q",[SOSG N↔GO L0↔SETZ CHR,↔CALL(EDSYS+1,N,CHR)↔POPJ P,]
	XWD "Z",JOIN
	XWD "+",[MOVEI SGN,1↔AOS(P)↔POPJ P,]
	XWD "-",[SKIPN SGN↔MOVEI SGN,1↔MOVN SGN,SGN↔AOS(P)↔POPJ P,]
	XWD "E",[EDEXIT: PGIOT 2,↔POP P,0↔POP1J]
		CLEN1←←.-CTAB1
	XWD  12,INSLIN			; εCR
	XWD "I",INSLIN			; εI
	XWD "D",DELLIN			; εD
		CLEN3←←.-CTAB3
;META----------------------------------------------------------------
CTAB2:	XWD 12,UNKNOWN
		CLEN2←←.-CTAB2
;MOVE CURSOR
;--------------------------------------------------------------------
MOVER:	SETZ CHR,
	LAC N,NODE1
MOVER2:	SKIPN CNT↔MOVEI CNT,1		;DEFAULT ITERATION = 1
	IMUL CNT,0
	SKIPGE SGN↔MOVNS CNT		;SIGN OF ITERATION.
	JUMPL CNT,BACK

FORWRD:	PLINK N,N
	JUMPE N,.+3
	DAC N,NODE1
	SOJG CNT,FORWRD
	POPJ P,

BACK:	NLINK N,N
	JUMPE N,.+3
	DAC N,NODE1
	AOJL CNT,BACK
	POPJ P,
;--------------------------------------------------------------------
;DELETE
DELLIN:	LAC N,NODE1
	SKIPN CNT↔MOVEI CNT,1		;DEFAULT ITERATION = 1
	JUMPL SGN,DBACK

DFORE:	SETQ(NODE1,{KLTEXT,NODE1})	;DELETE FORWARDS.
	JUMPE N,L0
	SOJG CNT,DFORE
	GO L0

DBACK:	NLINK N,N		;DELETE BACKWARDS.
	JUMPE N,L0
	SETQ(NODE1,{KLTEXT,NODE1})
	SOJG CNT,DBACK
	JUMPE N,L0

JOIN:	;CALL(NXTLIN,N)
	JUMPE 1,L0
;	TCW 1,1
;	MARK 1,CONBIT
	GO L0
;LINED
LINED:	LAC N,NODE1
	PLINK 1,N↔JUMPE 1,[CALL(INSTXT)↔GO LINED]
	CALL(EDSYS,CHR)
	DAC 1,CHR↔POPJ P,
;--------------------------------------------------------------------
INSLIN: NLINK N,N
	JUMPG CNT,INSLI2
NEWTXT:	CALL(INSTXT)
	CALL(EDDPY,["↔"])
	SETZM CLRLIN
	CALL(EDSYS,[0])
	CAIN 1,12↔GO NEWTXT
	GO L0
INSLI2:	CALL(INSTXT)↔SOJG CNT,.-1
	NLINK N,N↔GO L0
ENDR EDTEXT;2/11/75(BGB)---------------------------------------------

SUBR(INSTXT)	;INSERT NEW TEXT NODE AFTER NODE1
COMMENT .-----------------------------------------------------------.
	CALL(MKNODE)
	SETZ↔LAC 2,NODE1↔CDR 3,(2)
	DIP 2,(1)↔DAP 1,(2)		;RING IN
	DAP 3,(1)↔DIP 1,(3)↔DAC 1,NODE1
	POP0J
ENDR INSTXT;2/10/75(BGB)--------------------------------------------.

SUBR(SETEXT,PROCED)
COMMENT .-----------------------------------------------------------.
	CDR 2,NODE1↔HRLI 2,700		;BYTE POINTER INTO NODE.
L1:	PUSHJ P,@PROCED↔GO L2		;EQUIVALENT TO INCHWL 1
	CAIE 12↔CAIN 175↔GO L2
	IDPB 1,2↔GO L1
L2:	SETZ 1,↔IDPB 1,2↔POP1J]		;TERMINATION ON LF OR ALT.
ENDR SETEXT;2/10/75(BGB)--------------------------------------------.
SUBR(LOOKUP,KEY)
COMMENT .-----------------------------------------------------------.
	ACCUMULATORS{PTR,LO,HI}
	LAC KEY↔SETZ 1,				;INITIALIZATION
	MOVEI LO,ORGTAB↔MOVEI HI,ENDTAB		
L1:	CAMGE HI,LO↔POP1J			;TEST FOR END
	LAC PTR,LO↔ADD PTR,HI↔ASH PTR,-1	;PTR ← (LO+HI)/2
	CAMGE (PTR)↔GO[MOVEI PTR,-2(HI)↔GO L1]	;KEY < TABLE(PTR)
	CAME  (PTR)↔GO[MOVEI PTR, 2(LO)↔GO L1]	;KEY > TABLE(PTR)
	LAC 1,1(PTR)↔POP1J			;KEY = TABLE(PTR)
ENDR LOOKUP;---------------------------------------------------------

END SA